import axios, { AxiosError, AxiosResponse } from 'axios'
//获取个人信息，主要是token
// import { useSettingStore } from '@/store/user';
// 消息提示组件
import { Toast } from 'antd-mobile'
// 创建新的axios实例
const service = axios.create({
  // 公共接口
  baseURL: 'http://localhost:3000',
  // 超时时间
  timeout: 3000,
  headers: {
    'Content-Type': 'application/json', //默认内容类型
    'X-Custom-Header': 'CustomValue', //自定义请求头
  },
})

// 请求拦截器
service.interceptors.request.use(
  (confirg) => {
    console.log(confirg)

    // 发请求前做的一些处理，数据转化，配置请求头，设置token,设置loading等
    // 每次发送请求之前判断pinia中是否存在token,如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
    const token = localStorage.getItem('token')
    if (token) {
      confirg.headers.Authorization = `Bearer ${token}`
    }
    //如果需要，可以在每次请求时动态添加其他自定义头部信息(第一种方法)
    /*   confirg.headers['X-Requested-With']='XMLHttpRequest' */

    //设置loading
    Toast.show({
      icon: 'loading',
      content: '加载中…',
      duration: 0, //一直存在
      // forbidClick:true,//禁止点击
    })
    return confirg
  },
  //请求错误做些什么
  (error: AxiosError) => {
    //出现请求错误，清除toast
    Toast.clear()
    //请求错误，这里可以用全局提示框进行提示
    Toast.show({
      icon: 'fail',
      content: '请求错误，请稍后再试',
      duration: 5,
    })
    return Promise.reject(error)
  }
)

//定义一个辅助函数来封装axios请求并加入重试逻辑
/* const retryableAxios =async(config,retries=3,delay = 1000)=>{
    let attempts=0
     // 尝试发送请求直到成功或达到最大重试次数
     while(attempts<retries){
        try{
            const response =await axios(config)
            return response
        }catch(error){
            attempts++
            if(attempts === retries) throw error;
            await new Promise(resolve => setTimeout(resolve,delay*attempts))// 指数退避算法
        }
     }
} */

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    const { status, data } = response
    if (status === 200) {
      // 接口网络请求成功，关闭等待提示
      if (data.code === 0) {
        Toast.clear()
        return data
      } else {
        console.log(Promise.reject(data), '2222222222')
        return Promise.reject(data)
      }
    }
  },
  (error: AxiosError) => {
    const { response, request } = error
    //响应失败，关闭等待提示
    Toast.clear()
    //提示错误信息
    if (JSON.stringify(error).includes('Network Error')) {
      Toast.show({
        icon: 'fail',
        content: '网络超时',
        duration: 5,
      })
    }

    //根据响应的错误状态码，做不同的处理，此处只是作为示例，请根据实际业务处理
    if (response) {
      if (response.status === 400) {
        Toast.show({
          icon: 'fail',
          content: '报错信息',
          duration: 5,
        })
      } else if (response.status === 404) {
        Toast.show({
          icon: 'fail',
          content: '报错信息',
          duration: 5,
        })
      } else {
        Toast.show({
          icon: 'fail',
          content: '报错信息',
          duration: 5,
        })
      }
    } else if (request) {
      // 请求已发出但没有收到响应（例如：网络连接问题）
      Toast.show({
        icon: 'fail',
        content: '未收到响应',
        duration: 5,
      })
      console.log(request, '未收到响应')
    }
    return Promise.reject(error)
  }
)

export default service
